#include <gobject/gvaluecollector.h>
#include <cairo-gobject.h>
-#include "gtktypebuiltins.h"
#include "gtkstyleprovider.h"
#include "gtksymboliccolor.h"
-#include "gtkprivate.h"
#include "gtkthemingengine.h"
#include "gtkanimationdescription.h"
-#include "gtkborder.h"
#include "gtkgradient.h"
-#include "gtk9slice.h"
#include "gtkshadowprivate.h"
+
+#include "gtkstylepropertyprivate.h"
#include "gtkintl.h"
/**
GHashTable *properties;
};
-static GHashTable *properties = NULL;
-
static void gtk_style_properties_provider_init (GtkStyleProviderIface *iface);
static void gtk_style_properties_finalize (GObject *object);
iface->get_style = gtk_style_properties_get_style;
}
-static void
-gtk_style_property_init (void)
-{
- GParamSpec *pspec;
-
- if (G_LIKELY (properties))
- return;
-
- /* stuff is never freed, so no need for free functions */
- properties = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* note that gtk_style_properties_register_property() calls this function,
- * so make sure we're sanely inited to avoid infloops */
-
- pspec = g_param_spec_boxed ("color",
- "Foreground color",
- "Foreground color",
- GDK_TYPE_RGBA, 0);
- gtk_style_param_set_inherit (pspec, TRUE);
- gtk_style_properties_register_property (NULL, pspec);
-
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("background-color",
- "Background color",
- "Background color",
- GDK_TYPE_RGBA, 0));
-
- pspec = g_param_spec_boxed ("font",
- "Font Description",
- "Font Description",
- PANGO_TYPE_FONT_DESCRIPTION, 0);
- gtk_style_param_set_inherit (pspec, TRUE);
- gtk_style_properties_register_property (NULL, pspec);
-
- pspec = g_param_spec_boxed ("text-shadow",
- "Text shadow",
- "Text shadow",
- GTK_TYPE_SHADOW, 0);
- gtk_style_param_set_inherit (pspec, TRUE);
- gtk_style_properties_register_property (NULL, pspec);
-
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("margin",
- "Margin",
- "Margin",
- GTK_TYPE_BORDER, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("padding",
- "Padding",
- "Padding",
- GTK_TYPE_BORDER, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("border-width",
- "Border width",
- "Border width, in pixels",
- GTK_TYPE_BORDER, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_int ("border-radius",
- "Border radius",
- "Border radius, in pixels",
- 0, G_MAXINT, 0, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_enum ("border-style",
- "Border style",
- "Border style",
- GTK_TYPE_BORDER_STYLE,
- GTK_BORDER_STYLE_NONE, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("border-color",
- "Border color",
- "Border color",
- GDK_TYPE_RGBA, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("background-image",
- "Background Image",
- "Background Image",
- CAIRO_GOBJECT_TYPE_PATTERN, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("border-image",
- "Border Image",
- "Border Image",
- GTK_TYPE_9SLICE, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_object ("engine",
- "Theming Engine",
- "Theming Engine",
- GTK_TYPE_THEMING_ENGINE, 0));
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("transition",
- "Transition animation description",
- "Transition animation description",
- GTK_TYPE_ANIMATION_DESCRIPTION, 0));
-
- /* Private property holding the binding sets */
- gtk_style_properties_register_property (NULL,
- g_param_spec_boxed ("gtk-key-bindings",
- "Key bindings",
- "Key bindings",
- G_TYPE_PTR_ARRAY, 0));
-}
-
-const GtkStyleProperty *
-_gtk_style_property_lookup (const char *name)
-{
- gtk_style_property_init ();
-
- return g_hash_table_lookup (properties, name);
-}
-
/* Property registration functions */
/**
gtk_style_properties_register_property (GtkStylePropertyParser parse_func,
GParamSpec *pspec)
{
- const GtkStyleProperty *existing;
- GtkStyleProperty *node;
-
g_return_if_fail (G_IS_PARAM_SPEC (pspec));
- gtk_style_property_init ();
-
- existing = _gtk_style_property_lookup (pspec->name);
- if (existing != NULL)
- {
- g_warning ("Property \"%s\" was already registered with type %s",
- pspec->name, g_type_name (existing->pspec->value_type));
- return;
- }
-
- node = g_slice_new0 (GtkStyleProperty);
- node->pspec = pspec;
- node->parse_func = parse_func;
-
- g_hash_table_insert (properties, pspec->name, node);
+ _gtk_style_property_register (pspec,
+ parse_func);
}
/**
G_BEGIN_DECLS
-typedef struct _GtkStyleProperty GtkStyleProperty;
-
-struct _GtkStyleProperty
-{
- GParamSpec *pspec;
- GtkStylePropertyParser parse_func;
-};
-
-const GtkStyleProperty * _gtk_style_property_lookup (const char *name);
-
const GValue * _gtk_style_properties_peek_property (GtkStyleProperties *props,
const gchar *prop_name,
GtkStateFlags state);
#include "gtkgradient.h"
#include "gtkshadowprivate.h"
#include "gtkthemingengine.h"
+#include "gtktypebuiltins.h"
typedef gboolean (* ParseFunc) (GtkCssParser *parser,
GFile *base,
static GHashTable *parse_funcs = NULL;
static GHashTable *to_string_funcs = NULL;
+static GHashTable *properties = NULL;
static void
register_conversion_function (GType type,
return g_strdup_value_contents (value);
}
+
+static void
+gtk_style_property_init (void)
+{
+ GParamSpec *pspec;
+
+ if (G_LIKELY (properties))
+ return;
+
+ /* stuff is never freed, so no need for free functions */
+ properties = g_hash_table_new (g_str_hash, g_str_equal);
+
+ /* note that gtk_style_properties_register_property() calls this function,
+ * so make sure we're sanely inited to avoid infloops */
+
+ pspec = g_param_spec_boxed ("color",
+ "Foreground color",
+ "Foreground color",
+ GDK_TYPE_RGBA, 0);
+ gtk_style_param_set_inherit (pspec, TRUE);
+ gtk_style_properties_register_property (NULL, pspec);
+
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("background-color",
+ "Background color",
+ "Background color",
+ GDK_TYPE_RGBA, 0));
+
+ pspec = g_param_spec_boxed ("font",
+ "Font Description",
+ "Font Description",
+ PANGO_TYPE_FONT_DESCRIPTION, 0);
+ gtk_style_param_set_inherit (pspec, TRUE);
+ gtk_style_properties_register_property (NULL, pspec);
+
+ pspec = g_param_spec_boxed ("text-shadow",
+ "Text shadow",
+ "Text shadow",
+ GTK_TYPE_SHADOW, 0);
+ gtk_style_param_set_inherit (pspec, TRUE);
+ gtk_style_properties_register_property (NULL, pspec);
+
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("margin",
+ "Margin",
+ "Margin",
+ GTK_TYPE_BORDER, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("padding",
+ "Padding",
+ "Padding",
+ GTK_TYPE_BORDER, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("border-width",
+ "Border width",
+ "Border width, in pixels",
+ GTK_TYPE_BORDER, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_int ("border-radius",
+ "Border radius",
+ "Border radius, in pixels",
+ 0, G_MAXINT, 0, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_enum ("border-style",
+ "Border style",
+ "Border style",
+ GTK_TYPE_BORDER_STYLE,
+ GTK_BORDER_STYLE_NONE, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("border-color",
+ "Border color",
+ "Border color",
+ GDK_TYPE_RGBA, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("background-image",
+ "Background Image",
+ "Background Image",
+ CAIRO_GOBJECT_TYPE_PATTERN, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("border-image",
+ "Border Image",
+ "Border Image",
+ GTK_TYPE_9SLICE, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_object ("engine",
+ "Theming Engine",
+ "Theming Engine",
+ GTK_TYPE_THEMING_ENGINE, 0));
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("transition",
+ "Transition animation description",
+ "Transition animation description",
+ GTK_TYPE_ANIMATION_DESCRIPTION, 0));
+
+ /* Private property holding the binding sets */
+ gtk_style_properties_register_property (NULL,
+ g_param_spec_boxed ("gtk-key-bindings",
+ "Key bindings",
+ "Key bindings",
+ G_TYPE_PTR_ARRAY, 0));
+}
+
+const GtkStyleProperty *
+_gtk_style_property_lookup (const char *name)
+{
+ gtk_style_property_init ();
+
+ return g_hash_table_lookup (properties, name);
+}
+
+void
+_gtk_style_property_register (GParamSpec *pspec,
+ GtkStylePropertyParser parse_func)
+{
+ const GtkStyleProperty *existing;
+ GtkStyleProperty *node;
+
+ gtk_style_property_init ();
+
+ existing = _gtk_style_property_lookup (pspec->name);
+ if (existing != NULL)
+ {
+ g_warning ("Property \"%s\" was already registered with type %s",
+ pspec->name, g_type_name (existing->pspec->value_type));
+ return;
+ }
+
+ node = g_slice_new0 (GtkStyleProperty);
+ node->pspec = pspec;
+ node->parse_func = parse_func;
+
+ g_hash_table_insert (properties, pspec->name, node);
+}
G_BEGIN_DECLS
+typedef struct _GtkStyleProperty GtkStyleProperty;
+
+struct _GtkStyleProperty
+{
+ GParamSpec *pspec;
+ GtkStylePropertyParser parse_func;
+};
+
+const GtkStyleProperty * _gtk_style_property_lookup (const char *name);
+
+void _gtk_style_property_register (GParamSpec *pspec,
+ GtkStylePropertyParser parse_func);
+
gboolean _gtk_css_value_parse (GValue *value,
GtkCssParser *parser,
GFile *base);